package org.ceteca.explica.core.common;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;

import org.ceteca.explica.core.management.DocumentLineOT;
import org.ceteca.explica.core.management.DocumentOT;
import org.ceteca.explica.core.management.InterfaceManagement;

public class DocumentTotal implements Serializable{

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private BigDecimal baseImponible;
	private BigDecimal dtoComercial, dtoPP, importeDtoComercial, importeDtoPP;
	private int numLineas, numTiposIVA;
	private BigDecimal total;
	private DocumentOT document;
	private int resultadoCalculo;
	private ArrayList<LineaDesgloseIVA> desgloseIVA = new ArrayList<LineaDesgloseIVA>();
	private ArrayList<LineaDesgloseIVA> desgloseApicable = new ArrayList<LineaDesgloseIVA>();
	private BigDecimal sumaImportes;
	
	
	
	public DocumentTotal(DocumentOT doc) {
		this.document=doc;
		calcular();
	}

	public int calcular() {
		try{
		if (document == null) {
			resultadoCalculo = InterfaceManagement.PARAMETER_RESULTADO_CALCULO_DOCUMENTO_NULO;
			return InterfaceManagement.PARAMETER_RESULTADO_CALCULO_DOCUMENTO_NULO;
		}
		baseImponible = new BigDecimal(0);
		sumaImportes=new BigDecimal(0);
		numLineas = 0;
		desgloseIVA = new ArrayList<LineaDesgloseIVA>();
		for (DocumentLineOT line : document.getLines()) 
		{
			
			sumaImportes=sumaImportes.add(line.getNetAmountBeforeTax());
			numLineas++;
			boolean yaExiste = false;
			for (LineaDesgloseIVA d : desgloseIVA){
				System.out.println("Comparando:" +line.getVat()+" con" + d.getIva());
				
				if (line.getVat().compareTo(d.getIva())==0
						&& line.getRe().compareTo(d.getRE())==0) {
					System.out.println("Iguales");
					d.setBaseImponible(d.getBaseImponible().add(
							 line.getNetAmountBeforeTax()));
					yaExiste = true;
				}else{
					System.out.println("No iguales");
				}
			}
			if (!yaExiste) {
				System.out.println("Nueva linea desglose de iva: "+line.getNetAmountBeforeTax()+" - "+line.getVat()+ "%");
				LineaDesgloseIVA l = new LineaDesgloseIVA();
				l.setBaseImponible(line.getNetAmountBeforeTax());
				l.setIva(line.getVat());
				l.setRE(line.getRe());
				if (l.getBaseImponible().compareTo(new BigDecimal(0))!=0)
					desgloseIVA.add(l);
			}
		}
		dtoComercial = document.getFixedDiscount();
		dtoPP = document.getPromptPaymentDiscount();
		importeDtoComercial = sumaImportes.multiply(dtoComercial).divide(new BigDecimal(100));
		baseImponible=sumaImportes.subtract(importeDtoComercial);
		importeDtoPP = getDtoPPAplicable().multiply(baseImponible).divide(new BigDecimal(100));
		baseImponible= baseImponible.subtract(importeDtoPP);

	
		
		desgloseApicable = new ArrayList<LineaDesgloseIVA>();
		switch (document.getVatRegime()) {
		case InterfaceManagement.PARAMATER_VAT_EXEMPT:
			LineaDesgloseIVA l = new LineaDesgloseIVA();
			l.setBaseImponible(baseImponible);
			l.setIva(new BigDecimal(0));
			l.setRE(new BigDecimal(0));
			desgloseApicable.add(l);
			break;
		case InterfaceManagement.PARAMATER_VAT_STANDARD:
			for (LineaDesgloseIVA lin : desgloseIVA) {
				boolean ivaExistente=false;
				for (LineaDesgloseIVA d:desgloseApicable)
					if (lin.getIva()==d.getIva()){
						ivaExistente=true;
						d.setBaseImponible(d.getBaseImponible().add(lin.getBaseImponible().multiply(baseImponible).divide(sumaImportes)));
					}
				if (!ivaExistente){
					LineaDesgloseIVA nl=new LineaDesgloseIVA();
					nl.setBaseImponible(lin.getBaseImponible().multiply(baseImponible).divide(sumaImportes));
					nl.setIva(lin.getIva());
					nl.setRE(new BigDecimal(0));
					desgloseApicable.add(nl);
				}
			}
			break;
		case InterfaceManagement.PARAMATER_VAT_REDUCED:
			break;
		case InterfaceManagement.PARAMATER_VAT_EQUIVALENCE:
			for (LineaDesgloseIVA lin : desgloseIVA) {
				LineaDesgloseIVA nl = new LineaDesgloseIVA();
				nl.setBaseImponible(lin.getBaseImponible().multiply(baseImponible).divide(sumaImportes));
				nl.setIva(lin.getIva());
				nl.setRE(lin.getRE());
				desgloseApicable.add(nl);
			}
			break;
		}
		total=baseImponible.add(getImporteIva()).add(getImporteRE());
		return InterfaceManagement.PARAMETER_RESULTADO_CALCULO_DOCUMENTO_CORRECTO;
		}catch(Exception e){
			//e.printStackTrace();
			return InterfaceManagement.PARAMETER_RESULTADO_CALCULO_ERROR;
		}
	}

	public BigDecimal getDtoPPAplicable() {
		BigDecimal result = new BigDecimal(0);
		if (document != null)
			if (document.getPaymentMethod() != null)
				if (document.getPaymentMethod().isCash())
					result = getDtoPP();

		return result;

	}

	public BigDecimal getBaseImponible() {
		return baseImponible;
	}

	public void setBaseImponible(BigDecimal baseImponible) {
		this.baseImponible = baseImponible;
	}



	public BigDecimal getDtoComercial() {
		return dtoComercial;
	}

	public void setDtoComercial(BigDecimal dtoComercial) {
		this.dtoComercial = dtoComercial;
	}

	public BigDecimal getDtoPP() {
		return dtoPP;
	}

	public void setDtoPP(BigDecimal dtoPP) {
		this.dtoPP = dtoPP;
	}

	public BigDecimal getImporteDtoComercial() {
		return importeDtoComercial;
	}

	public void setImporteDtoComercial(BigDecimal importeDtoComercial) {
		this.importeDtoComercial = importeDtoComercial;
	}

	public BigDecimal getImporteDtoPP() {
		return importeDtoPP;
	}

	public void setImporteDtoPP(BigDecimal importeDtoPP) {
		this.importeDtoPP = importeDtoPP;
	}

	public int getNumLineas() {
		return numLineas;
	}

	public void setNumLineas(int numLineas) {
		this.numLineas = numLineas;
	}

	public BigDecimal getTotal() {
		return total;
	}

	public void setTotal(BigDecimal total) {
		this.total = total;
	}



	public DocumentOT getDocument() {
		return document;
	}

	public void setDocument(DocumentOT document) {
		this.document = document;
	}



	public int getNumTiposIVA() {
		return numTiposIVA;
	}

	public void setNumTiposIVA(int numTiposIVA) {
		this.numTiposIVA = numTiposIVA;
	}

	public ArrayList<LineaDesgloseIVA> getDesgloseIVA() {
		return desgloseIVA;
	}

	public void setDesgloseIVA(ArrayList<LineaDesgloseIVA> desgloseIVA) {
		this.desgloseIVA = desgloseIVA;
	}

	public ArrayList<LineaDesgloseIVA> getDesgloseApicable() {
		return desgloseApicable;
	}

	public void setDesgloseApicable(ArrayList<LineaDesgloseIVA> desgloseApicable) {
		this.desgloseApicable = desgloseApicable;
	}

	public BigDecimal getSumaImportes() {
		return sumaImportes;
	}

	public void setSumaImportes(BigDecimal sumaImportes) {
		this.sumaImportes = sumaImportes;
	}

	public int getResultadoCalculo() {
		return resultadoCalculo;
	}

	public void setResultadoCalculo(int resultadoCalculo) {
		this.resultadoCalculo = resultadoCalculo;
	}
	
	public BigDecimal getImporteIva(){
		try{
		BigDecimal result=new BigDecimal(0);
		for (LineaDesgloseIVA l:desgloseApicable)
			result=result.add(getBaseImponible().multiply(l.getIva()).divide(new BigDecimal(100)));
		return result;
		}catch(ArithmeticException e){
			return new BigDecimal(0);
		}
		
	}

	public BigDecimal getImporteRE(){
			try{
			BigDecimal result=new BigDecimal(0);
			for (LineaDesgloseIVA l:desgloseApicable)
				result=result.add(getBaseImponible().multiply(l.getRE()).divide(new BigDecimal(0)));
			return result;
			}catch(ArithmeticException e){
				return new BigDecimal(0);
			}
				
			
			
		}
	
	
}
